package com.itheima.controller;

import com.itheima.constant.MessageConstant;
import com.itheima.entity.Result;
import com.itheima.service.MedicalUploadService;
import com.itheima.utils.POIUtils;
import com.itheima.utils.QiniuUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @Author yangsen
 * @desc 体检报告上传
 * @Date 2020/10/30 17:14
 */
@RestController
@RequestMapping("/medical")
public class MedicalUploadController {


    //远程注入
    @Reference
    private MedicalUploadService medicalUploadService;


    /**
     * 体检报告上传操作
     *
     * @param imgFile    体检报告
     * @param fileNumber 体检人编号
     * @param name       体检人名字
     * @param id         体检人id
     * @return
     */
    @RequestMapping("/upload")
    public Result add(@RequestParam("imgFile") MultipartFile imgFile,
                      @RequestParam("fileNumber") String fileNumber,
                      @RequestParam("name") String name,
                      @RequestParam("id") String id) {
        //通过工具类进行文件上传
        try {
            //通过工具类获取表格的所有的数据
            List<String[]> list = POIUtils.readExcel(imgFile);

            //获取体检人的名字和体检的日期
            String[] row_4 = list.get(5);
            String name1 = row_4[2];  //姓名
            String[] row_2 = list.get(2);
            String number = row_2[4];  //档案号
            String[] row_3 = list.get(3);
            String healthDate = row_3[6];  //日期

            //将日期的 / 转成  -
            String date = healthDate.replace("/", "-");

            //获取到文件的名字
            String originalFilename = imgFile.getOriginalFilename();   //传过来的全名
            //获取到文件的后缀名
            int index = originalFilename.lastIndexOf(".");   //最后一个点的所有  例如  q.q.jnp  获取最后一个点
            //从最后一个点截取，获取后缀名
            String endName = originalFilename.substring(index);  //  表示连点一起拿出来  例如  .jnp

            //将uuid和后缀名一起拼接成一个完整的名字，发送给服务器
            String fileName = name1 + date + "-" + number + endName;   //命名格式  杨森2020-11-11-10086.xlsx

            //判断一下在文件中的档案号和名字和改会员真是名字和档案号是否一致
            if (fileNumber.equals(number) && name.equals(name1)) {
                //表示一致 一致才上传和存入数据库
                QiniuUtils.upload2Qiniu(imgFile.getBytes(), fileName);

                //调用方法，向数据库添加数据
                medicalUploadService.add("http://qi61f4fnz.hd-bkt.clouddn.com/" + fileName, id, fileNumber);

            } else {
                //不一致，报错
                throw new RuntimeException("体检报告表中编号和用户编号不一致");
            }


            return new Result(true, MessageConstant.HEALTH_UPLOAD_SUCCESS);

        } catch (RuntimeException e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.FILENAME_INCONFORMITY);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.HEALTH_UPLOAD_FAIL);
        }
    }


    /**
     * 删除体检报告
     *
     * @param id 会员的id
     * @return
     */
    @PreAuthorize("hasRole('ROLE_ADMIN')")   //系统管理员才有的权限
    @RequestMapping("/delete")
    public Result delete(Integer id) {
        try {
            //获取云端的地址
            List<String> list = medicalUploadService.getHealthURL(id);

            for (String fileName : list) {

                //每一个云端的地址，获取到文件的名字 截取后面的名称
                // http://qi61f4fnz.hd-bkt.clouddn.com/

                String substring = fileName.substring(36);

                if (substring != null) {
                    //通过地址进行删除云端的文件
                    QiniuUtils.deleteFileFromQiniu(substring);
                }
            }

            //删除数据库的数据
            medicalUploadService.delete(id);

            return new Result(true, MessageConstant.HEALTH_DELETE_SUCCESS);
        } catch (RuntimeException e) {
//            e.printStackTrace();
            return new Result(false, MessageConstant.NOTFINDHEALTH);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.HEALTH_DELETE_FAIL);
        }

    }

    /**
     * 下载体检报告
     *
     * @param id 会员的id
     * @return
     */
    @PreAuthorize("hasRole('ROLE_ADMIN')")   //系统管理员才有的权限
    @RequestMapping("/downloadHealthFrom")
    public Result downloadHealthFrom(Integer id) {
        try {
            //获取云端的地址
            List<String> list = medicalUploadService.getHealthURL(id);

            if (list.size() == 0) {
                //表示没有体检报告
                throw new RuntimeException("该用户没有体检报告");
            }



            return new Result(true, MessageConstant.DOWNLOAD_DELETE_SUCCESS,list);
        } catch (RuntimeException e) {
//            e.printStackTrace();
            return new Result(false, MessageConstant.NOTFINDHEALTH);
        }catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.DOWNLOAD_DELETE_FAIL);
        }

    }


}
